在 Vue.js 有的生命週期在 Livewire 中也都有,除此之外在 Livewire 中各自變數也有各自的生命週期,讓你能更方便的對各個變數週期事件單獨做操作。
以下就來看看有哪些吧:
| Hooks | 敘述 | 
|---|---|
| mount | 在元件選染完成後只會執行一次,且執行在 render()之前。 | 
| hydrate | 每個請求時都會執行一次。 | 
| hydrateFoo | 同上,但只限 $foo呼叫後後執行。 | 
| dehydrate | 每個請求時都會執行一次。 | 
| dehydrateFoo | 同上,但只限 $foo呼叫後後執行。 | 
| updating | 當透過 wire:model進行更改之前執行。 | 
| updated | 當透過 wire:model進行更改之後執行。 | 
| updatingFoo | 跟上面 updating 一樣但只限更改$foo前執行。 | 
| updatedFoo | 跟上面 updated 一樣但只限更改$foo後執行。 | 
| updatingFooBar | 跟上面 updating 一樣但這邊能監聽裡數個變數,在更改$fooBar 或是$foo_bar 前執行。 | 
| updatedFooBar | 跟上面 updating 一樣但這邊能監聽裡數個變數,在更改$fooBar 或是$foo_bar 後執行。 | 
備註:
dehydrate是在 Livewire v2 才有的新東西。原先hydrate的功能是處理每個請求,包含wire:click透過 function 去修改變數時都能執行。但到了 Livewire v2 則分成了hydrate及dehydrate。其中的差異則在hydrate是 Livewire 在將 JS 轉至 PHP 時觸發執行,而dehydrate則是 PHP 轉 JS 時執行。
這邊我宣告了三個計數器,分別放置於對應的生命週期鉤子hydrate ,dehydrate ,updated 中。好來顯示我們做哪些事情會使其被觸發。而在前端頁面也分別顯示了這三個變數,並多用了一個$title來透過按鈕觸發 function 去更改,以及直接在 <input> 中用 wire:model($title) 的方式來看看分別會觸發哪些值。
可以到 DEMO 頁面來玩玩看!
<?php
namespace App\Http\Livewire\Example;
use Livewire\Component;
class Day9 extends Component
{
    public $counter_hydrate = 0;
    public $counter_dehydrate = 0;
    public $counter_updated = 0;
    public $title = 'init';
    public function mount()
    {
        $this->title = 'Hello World';
    }
    public function render()
    {
        return view('livewire.example.day9');
    }
    public function hydrate()
    {
        $this->counter_hydrate++;
    }
    public function dehydrate()
    {
        $this->counter_dehydrate++;
    }
    public function updated()
    {
        $this->counter_updated++;
    }
    // 以下為自訂函式
    public function updateTitle($newText)
    {
        // 透過按鈕觸發,因為不是透過 wire:model 去修改,所以不會觸發 updated
        $this->title = $newText;
    }
}
<div class="text-center">
    <h2>Day9: Lifecycle Hooks</h2>
    <h3>{{ $title }}</h3>
    <h5>hydrate counter: {{ $counter_hydrate }}</h5>
    <h5>dehydrate counter: {{ $counter_dehydrate }}</h5>
    <h5>updated counter: {{ $counter_updated }}</h5>
    <button class="ui button" wire:click="updateTitle('嗨嗨')">UpdateTitle</button>
    <div class="ui input">
      <input type="text" wire:model="title">
    </div>
</div>
最後能夠發現,updated 只有在 <input> 中的 wire:model() 所產生的變動會有反應。透過按鈕觸發 wire:click() 再由後端直接賦予數值的則不會觸發 update。這邊就與 Vue.js 的 updated 、 beforeUpdate  有所差異。
而 hydrate 及 dehydrate,在每個 請求 都會被觸發到,即便是沒有造成值的變動都會觸發。
只要有從前端送請求到後端都會觸發
雖然無法從這個範例觀察到 hydrate 及 dehydrate 的差異,但我使用 Livewire 寫了幾個專案也沒有用到 hydrate 及 dehydrate  所以當我有用到時再寫篇文章跟大家分享吧!!